Saltar para o conteúdo

Java Card

Origem: Wikipédia, a enciclopédia livre.
Este artigo é um esboço. Você pode ajudar a Wikipédia expandindo-o. Editor: considere marcar com um esboço mais específico.

Java Card é uma tecnologia que permite que pequenos aplicativos (applets) baseados na plataforma Java sejam executados com segurança em smart cards e dispositivos similares com limitações de processamento e armazenamento.

O Java Card é voltado a cartões SIM e a cartões para caixas eletrônicos. O primeiro Java Card foi apresentado em 1997 por várias empresas. Os produtos Java Card são baseados nas especificações da Plataforma Java Card desenvolvidas pela Oracle Corporation, e suas principais características são portabilidade e segurança.

Principais características

[editar | editar código-fonte]

O objetivo do Java Card é definir um ambiente de computação padrão para smart cards, permitindo que o mesmo miniaplicativo Java Card seja executado em diferentes tipos de cartão, da mesma forma que um miniaplicativo Java é executado em diferentes computadores. Como em Java, isso é feito usando a combinação de uma máquina virtual (a Java Card Virtual Machine, ou JCVM) e uma biblioteca de tempo de execução bem definida, que mira abstrair as diferenças entre diferentes plataformas. A portabilidade permanece mitigada por problemas de tamanho de memória, desempenho e tempo de execução (por exemplo, para protocolos de comunicação ou algoritmos criptográficos).

Em motivo de manter a compatibilidade entre o maior número de plataformas possível, muitos recursos da linguagem Java não são suportados pelo Java Card (os tipos char, double, float e long; o qualificador transient; enums; matrizes de mais de uma dimensão; finalização; clonagem de objeto e threads). Além disso, alguns recursos comuns do Java não são fornecidos no tempo de execução por muitos cartões inteligentes reais (em particular o tipo int e coleta de lixo de objetos).

Processo de desenvolvimento

[editar | editar código-fonte]

O desenvolvimento na plataforma é feito por meio do Java Card Development Kit (JCDK) e do Java Card Runtime Environment (JCRE), por meio de um conversor e simulador.

"Hello World" no Java Card

[editar | editar código-fonte]
 /*
 * Package:  org.wikipedia
 * Filename: HelloWorld.java
 * Class:    HelloWorld
 * Date:     [[13 de Dezembro]] de [[2021]]
 *
 */
 
 package org.wikipedia;
 
 import javacard.framework.*;
 
 public class HelloWorld extends javacard.framework.Applet {
 
 // Byte CLA
 
 final static byte HELLO_CLA = (byte) 0xB0;
 
 // Verificar PIN
 
 final static byte INS_HELLO = (byte) 0x20;
 
 public static void install(byte[] bArray, short bOffset, byte bLength) {
 
  (new HelloWorld()).register(
 
   bArray,
 
   (short) (bOffset + 1),
 
   bArray[bOffset]);
 
 }
 
 // Processa o comando APDU
 
 public void process(APDU apdu) {
 
  byte[] buffer = apdu.getBuffer();
 
  if ((buffer[ISO7816.OFFSET_CLA] == 0)
 
   && (buffer[ISO7816.OFFSET_INS] == (byte) (0xA4)))
 
   return;
 
  // Valida o byte CLA
 
  if (buffer[ISO7816.OFFSET_CLA] != HELLO_CLA)
 
   ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
 
  // Seleciona a instrução apropriada (Byte INS)
 
  switch (buffer[ISO7816.OFFSET_INS]) {
 
   case INS_HELLO :
 
    getHello(apdu);
 
    return;
 
   default :
 
    ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
 
  }
 
 }
 
 /**
 
  * @param apdu
 
  * @author Wikipedia
 
  * Get user id attribute
 
  */
 
 private void getHello(APDU apdu) {
 
  // Cadeia de bytes com a mensagem: "hello world Java Card"
 
  byte[] hello =
 
   {
 
    'h',
 
    'e',
 
    'l',
 
    'l',
 
    'o',
 
    ' ',
 
    'w',
 
    'o',
 
    'r',
 
    'l',
 
    'd',
 
    ' ',
 
    'J',
 
    'a',
 
    'v',
 
    'a',
 
    ' ',
 
    'C',
 
    'a',
 
    'r',
 
    'd' };
 
  // Informa ao JCRE que será enviado uma resposta
 
  short le = apdu.setOutgoing();
 
  short totalBytes = (short) hello.length;
 
  // Informa ao JCRE o tamanho da mensagem em bytes
 
  apdu.setOutgoingLength(totalBytes);
 
  // Envia a mensgem para o host
 
  apdu.sendBytesLong(hello, (short) 0, (short) hello.length);
 
  }
 
 }

Testando

Após enviar comando "select", envie o seguinte comando: B0 20 00 00

A saída será: 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 4A 61 76 61 20 43 61 72 64 90 00

Ligações externas

[editar | editar código-fonte]